﻿#include <iostream>
#include <vector>
#include <string>
#include <fstream>
using namespace std;

// 定义观察者接口
class Observer {
public:
    virtual void Update(int obstacle_status) = 0;
};

// 定义多线激光雷达类作为主题
class Lidar {
public:
    Lidar() : obstacle_status(0) {}  // 障碍物状态默认为0（无障碍物）

    // 发布主题，通知观察者（底盘模块）
    void PublishObstacleStatus() {
        cout << "激光雷达发布障碍物状态：" << obstacle_status << endl;
        NotifyObservers();  // 通知观察者
    }

        // 通知观察者
    void NotifyObservers() {
        for (auto observer : observers) {
            observer->Update(obstacle_status);
        }
    }

    // 订阅观察者（底盘模块）
    void AddObserver(Observer* observer) {
        observers.push_back(observer);
    }

    // 设置障碍物状态
    void SetObstacleStatus(int status) {
        obstacle_status = status;
    }

private:
    int obstacle_status;  // 障碍物状态，可以是1、2、3等表示不同方向的障碍物
    vector<Observer*> observers;  // 观察者列表
};

// 定义底盘模块类作为观察者
class Chassis : public Observer {
public:
    // 构造函数中注册为观察者
    Chassis(Lidar* lidar) {
        lidar->AddObserver(this);
    }

    // 实现观察者接口，接收观察者通知并执行对应操作
    void Update(int obstacle_status) override {
    switch (obstacle_status) {
      case 1:
        cout << "障碍物在前方，底盘后退" << endl;
        break;
      case 2:
        cout << "障碍物在左前方，底盘右转" << endl;
        break;
      case 3:
        cout << "障碍物在右前方，底盘左转" << endl;
        break;
      default:
        cout << "底盘无需任何操作，障碍物状态为" << obstacle_status << endl;
    }
    }
};

int main() {
    Lidar lidar;  // 创建激光雷达对象

    // 创建底盘对象并注册为观察者
    Chassis chassis(&lidar);

    // 模拟激光雷达检测到障碍物并发布通知
    int state;
    cout << "请输入障碍物状态，1代表前方障碍，2代表左前方障碍，3代表右前方障碍:" << endl;
    cin >> state;
    lidar.SetObstacleStatus(state);  // 设置障碍物状态为前方
    lidar.PublishObstacleStatus();  // 发布障碍物状态

    return 0;
}
